package servlet;

import com.drew.imaging.ImageMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.StringTokenizer;
import javax.servlet.ServletConfig;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Upload extends HttpServlet {

    private Random random = new Random();
    String cpath = "";
    String host = "111";
    String geohost = "777";
    String lldev = "777";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        try {
            ServletConfig conf = getServletConfig();
            host = conf.getInitParameter("host1");
            geohost = conf.getInitParameter("geohost");
            lldev = conf.getInitParameter("lldev");
        } catch (Exception e) {
            out.print("<b>" + e + "</b>");
        }


        //проверяем является ли полученный запрос multipart/form-data
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (!isMultipart) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // Создаём класс фабрику 
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // Максимальный буфера данных в байтах,
        // при его привышении данные начнут записываться на диск во временную директорию
        // устанавливаем один мегабайт
        factory.setSizeThreshold(1024 * 1024);

        // устанавливаем временную директорию
        File tempDir = (File) getServletContext().getAttribute("javax.servlet.context.tempdir");
        factory.setRepository(tempDir);

        //Создаём сам загрузчик
        ServletFileUpload upload = new ServletFileUpload(factory);

        //максимальный размер данных который разрешено загружать в байтах
        //по умолчанию -1, без ограничений. Устанавливаем 10 мегабайт. 
        upload.setSizeMax(1024 * 1024 * 10);

        try {
            List items = upload.parseRequest(request);
            Iterator iter = items.iterator();

            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();

                if (item.isFormField()) {
                    //если принимаемая часть данных является полем формы			    	
                    processFormField(item);
                } else {
                    //в противном случае рассматриваем как файл
                    processUploadedFile(item);
                }
            }

            //----------------------
            //File jpegFile = new File("/usr/local/apache-tomcat-7.0/webapps/01.jpg");
            File jpegFile = new File(cpath);
            Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);
            out.println("!!! 0.66");
            out.println("file saved on " + cpath + "<br/>");
            out.println("file cfg params :host[" + host + "];geohost[" + geohost + "];lldev[" + lldev + "];<br/>");
            out.println("<a  href='" + host + "uf/upload/" + getFileNameFromPath(cpath) + "'>...</a>");
            out.println("<hr/>");
            out.println("<hr/>");
            for (Directory directory : metadata.getDirectories()) {
                for (Tag tag : directory.getTags()) {
                    String tags = tag + "";
                    if (tags.indexOf("\"") > 0) {//sample if gps 41o 1' 2"
                        //out.println(tags);
                        if (getLatFromTag(tags).length() > 0) {
                            out.println("[<a href='" + geohost + "" + getLatFromTag(tags) + "");
                        }
                        if (getLonFromTag(tags).length() > 0) {
                            out.println(lldev + getLonFromTag(tags) + "'>...</a>]");
                        }
                    }
                    if (tags.indexOf("Time-Stamp") > 0) {//sample if timestamp Time-Stamp"
                        //out.println(tags);
                        if (getTimeStampTag(tags).length() > 0) {
                            out.println("<b>[time:" + getTimeStampTag(tags) + "]</b>");
                        }
                    }
                    if (tags.indexOf("Date Stamp") > 0) {//sample if timestamp Time-Stamp"
                        //out.println(tags);
                        if (getDateStampFromTag(tags).length() > 0) {
                            out.println("<b>[date:" + getDateStampFromTag(tags) + "]</b>");
                        }
                    }
                    //out.println(tag);
                    System.out.println(tag);
                }
                //out.println("<hr/>");
            }
            out.println("<hr/>");
            out.println("<hr/>");
            //out.println("<img alt='111' src='http://localhost:8080/uf/upload/"+getFileNameFromPath(cpath)+"'/>");
            out.println("<hr/>");

            //----------------------

        } catch (Exception e) {
            e.printStackTrace();
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }




    }

    /**
     * Сохраняет файл на сервере, в папке upload. Сама папка должна быть уже
     * создана.
     *
     * @param item
     * @throws Exception
     */
    private void processUploadedFile(FileItem item) throws Exception {
        File uploadetFile = null;
        //выбираем файлу имя пока не найдём свободное
        do {
            String path = getServletContext().getRealPath("/upload/" + random.nextInt() + item.getName());
            cpath = path;
            uploadetFile = new File(path);
        } while (uploadetFile.exists());

        //создаём файл
        uploadetFile.createNewFile();
        //записываем в него данные
        item.write(uploadetFile);


    }

    /**
     * Выводит на консоль имя параметра и значение
     *
     * @param item
     */
    private void processFormField(FileItem item) {
        System.out.println(item.getFieldName() + "=" + item.getString());
    }

    private String getFileNameFromPath(String path) {
        //System.out.println(item.getFieldName()+"="+item.getString());		

        String fname = path.substring(path.indexOf("/upload") + 7, path.length());
        return fname;
    }

    private String getLatFromTag(String tag) {
        //System.out.println(item.getFieldName()+"="+item.getString());		

        String res = "";
        String tmp1 = "";
        String tmp2 = "";
        String tmp3 = "";
        try {

            if (tag.indexOf("Latitude - ") > -1) {
                res = tag.substring(tag.indexOf("-") + 2, tag.indexOf("\""));
                tmp1 = res.substring(0, res.indexOf(" ") - 1);
                tmp2 = res.substring(res.indexOf(" ") + 1, res.indexOf("'"));
                tmp3 = res.substring(res.indexOf("'") + 2, res.length());
                res = res + "|" + tmp1 + "|" + tmp2 + "|" + tmp3;
                Double f = 0.1;
                f = Double.parseDouble(tmp1) + Double.parseDouble(tmp2) / 60 + Double.parseDouble(tmp3) / 3600;
                res = f + "";
            }



        } catch (Exception e) {
        }
        return res;
    }

    private String getLonFromTag(String tag) {
        //System.out.println(item.getFieldName()+"="+item.getString());		

        String res = "";
        String tmp1 = "";
        String tmp2 = "";
        String tmp3 = "";
        try {
            if (tag.indexOf("Longitude - ") > -1) {
                res = tag.substring(tag.indexOf("-") + 2, tag.indexOf("\""));
                tmp1 = res.substring(0, res.indexOf(" ") - 1);
                tmp2 = res.substring(res.indexOf(" ") + 1, res.indexOf("'"));
                tmp3 = res.substring(res.indexOf("'") + 2, res.length());
                res = res + "|" + tmp1 + "|" + tmp2 + "|" + tmp3;
                Double f = 0.1;
                f = Double.parseDouble(tmp1) + Double.parseDouble(tmp2) / 60 + Double.parseDouble(tmp3) / 3600;
                res = f + "";
            }
        } catch (Exception e) {
        }
        return res;
    }

    private String getDateStampFromTag(String tag) {
        //System.out.println(item.getFieldName()+"="+item.getString());		

        String res = "!!!";
        try {
            if (tag.indexOf("Date Stamp") > -1) {
                res = tag.substring(tag.indexOf("-") + 1, tag.indexOf("-") + 12);
            }
        } catch (Exception e) {
        }
        return res;
    }

    private String getTimeStampTag(String tag) {
        //System.out.println(item.getFieldName()+"="+item.getString());		

        String res = "!!!";
        try {
            if (tag.indexOf("Time-Stamp") > -1) {
                res = tag.substring(tag.indexOf("-") + 9, tag.indexOf("UTC") - 1);
            }
        } catch (Exception e) {
        }
        return res;
    }
}